package tools

import (
	"fmt"
	"goGin/model"
	"time"

	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
)

//自定义一个字符串
var jwtkey = []byte("127.0.0.1.com")

type Claims struct {
	Id uint
	jwt.StandardClaims
	Phone    int
	Password string
	Username string
}

//颁发token
func Settoken(m model.User) string {
	expireTime := time.Now().Add(7 * 24 * time.Hour)
	// fmt.Print(123)
	claims := &Claims{
		Id:       m.ID,
		Username: m.Username,
		Phone:    m.Phone,
		Password: m.Password,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expireTime.Unix(), //过期时间
			IssuedAt:  time.Now().Unix(),
			Issuer:    "127.0.0.1",  // 签名颁发者
			Subject:   "user token", //签名主题
		},
	}
	// fmt.Print(claims)
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// fmt.Println(token)
	tokenString, err := token.SignedString(jwtkey)
	if err != nil {
		fmt.Println(err)
		return err.Error()
	}
	return tokenString
	// ctx.JSON(200, gin.H{"token": tokenString})
}

//解析token
func Gettoken(ctx *gin.Context) (interface{}, interface{}) {
	tokenString := ctx.GetHeader("Authorization")
	//vcalidate token formate
	if tokenString == "" {
		// ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
		// ctx.Abort()
		return "token不能为空", nil
	}

	token, claims, err := ParseToken(tokenString)
	if err != nil || !token.Valid {
		// ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
		// ctx.Abort()
		return "token不匹配", nil
	}
	return claims, token
}

func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
	Claims := &Claims{}
	token, err := jwt.ParseWithClaims(tokenString, Claims, func(token *jwt.Token) (i interface{}, err error) {
		return jwtkey, nil
	})
	return token, Claims, err
}

// func refresh(c *gin.Context) {
// 	strToken := c.Param("token")
// 	claims, err := verifyAction(strToken)
// 	if err != nil {
// 		c.String(http.StatusNotFound, err)
// 		return
// 	}
// 	claims.ExpiresAt = time.Now().Unix() + (claims.ExpiresAt - claims.IssuedAt)
// 	signedToken, err := Gettoken(c)
// 	// return
// 	// if err != nil {
// 	// 	c.String(http.StatusNotFound, err.Error())
// 	// 	return
// 	// }
// 	c.String(http.StatusOK, signedToken)
// }

// func verifyAction(strToken string) (*Claims, interface{}) {
// 	token, err := jwt.ParseWithClaims(strToken, &Claims{}, func(token *jwt.Token) (interface{}, error) {
// 		return []byte(jwtkey), nil
// 	})
// 	if err != nil {
// 		return nil, ""
// 	}
// 	claims, ok := token.Claims.(*Claims)
// 	if !ok {
// 		return nil, ""
// 	}
// 	if err := token.Claims.Valid(); err != nil {
// 		return nil, ""
// 	}
// 	fmt.Println("verify")
// 	return claims, nil
// }
